// 事件模块中文封装
const EventEmitter = require('events');

/**
 * 创建事件发射器实例
 * @returns {EventEmitter} 事件发射器实例
 */
function 创建事件发射器() {
  return new EventEmitter();
}

/**
 * 添加事件监听器
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {string|symbol} 事件名 - 事件名称
 * @param {Function} 监听器 - 事件处理函数
 * @returns {EventEmitter} 事件发射器实例，用于链式调用
 */
function 添加事件监听(事件发射器, 事件名, 监听器) {
  return 事件发射器.on(事件名, 监听器);
}

/**
 * 添加一次性事件监听器
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {string|symbol} 事件名 - 事件名称
 * @param {Function} 监听器 - 事件处理函数
 * @returns {EventEmitter} 事件发射器实例，用于链式调用
 */
function 添加一次性事件监听(事件发射器, 事件名, 监听器) {
  return 事件发射器.once(事件名, 监听器);
}

/**
 * 移除事件监听器
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {string|symbol} 事件名 - 事件名称
 * @param {Function} 监听器 - 要移除的事件处理函数
 * @returns {EventEmitter} 事件发射器实例，用于链式调用
 */
function 移除事件监听(事件发射器, 事件名, 监听器) {
  return 事件发射器.off(事件名, 监听器);
}

/**
 * 移除所有事件监听器
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {string|symbol} 事件名 - 可选，指定要移除所有监听器的事件名称
 * @returns {EventEmitter} 事件发射器实例，用于链式调用
 */
function 移除所有事件监听(事件发射器, 事件名) {
  return 事件发射器.removeAllListeners(事件名);
}

/**
 * 触发事件
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {string|symbol} 事件名 - 事件名称
 * @param {...*} 参数 - 传递给监听器的参数
 * @returns {boolean} 是否有监听器被调用
 */
function 触发事件(事件发射器, 事件名, ...参数) {
  return 事件发射器.emit(事件名, ...参数);
}

/**
 * 获取事件的所有监听器
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {string|symbol} 事件名 - 事件名称
 * @returns {Function[]} 监听器数组
 */
function 获取事件监听器(事件发射器, 事件名) {
  return 事件发射器.listeners(事件名);
}

/**
 * 获取事件的所有监听器（包括封装的监听器）
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {string|symbol} 事件名 - 事件名称
 * @returns {Function[]} 监听器数组
 */
function 获取原始事件监听器(事件发射器, 事件名) {
  return 事件发射器.rawListeners(事件名);
}

/**
 * 设置事件最大监听器数量
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {number} 数量 - 最大监听器数量
 * @returns {EventEmitter} 事件发射器实例，用于链式调用
 */
function 设置最大监听器数量(事件发射器, 数量) {
  return 事件发射器.setMaxListeners(数量);
}

/**
 * 获取事件最大监听器数量
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @returns {number} 最大监听器数量
 */
function 获取最大监听器数量(事件发射器) {
  return 事件发射器.getMaxListeners();
}

/**
 * 获取所有已注册的事件名称
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @returns {(string|symbol)[]} 事件名称数组
 */
function 获取事件名称(事件发射器) {
  return 事件发射器.eventNames();
}

/**
 * 获取事件监听器数量
 * @param {EventEmitter} 事件发射器 - 事件发射器实例
 * @param {string|symbol} 事件名 - 事件名称
 * @returns {number} 监听器数量
 */
function 获取监听器数量(事件发射器, 事件名) {
  return 事件发射器.listenerCount(事件名);
}

/**
 * 预配置的事件发射器类
 * 可以直接继承使用
 */
const 事件发射器类 = EventEmitter;

module.exports = {
  创建事件发射器,
  添加事件监听,
  添加一次性事件监听,
  移除事件监听,
  移除所有事件监听,
  触发事件,
  获取事件监听器,
  获取原始事件监听器,
  设置最大监听器数量,
  获取最大监听器数量,
  获取事件名称,
  获取监听器数量,
  事件发射器类
};